package org.jeecg.common.util;
import lombok.extern.slf4j.Slf4j;

import java.io.File;
import java.security.Security;
import java.util.Date;
import java.util.Properties;
import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.mail.*;
import javax.mail.internet.*;

@Slf4j
public class EmailUtil {

    private static String host;
    private static String port;
    private static String user;
    private static String password;

    public static String getHost() {
        return host;
    }

    public static void setHost(String host) {
        EmailUtil.host = host;
    }

    public static String getPort() {
        return port;
    }

    public static void setPort(String port) {
        EmailUtil.port = port;
    }

    public static String getUser() {
        return user;
    }

    public static void setUser(String user) {
        EmailUtil.user = user;
    }

    public static String getPassword() {
        return password;
    }

    public static void setPassword(String password) {
        EmailUtil.password = password;
    }

    public static String SSL_FACTORY = "javax.net.ssl.SSLSocketFactory";

    public static boolean sendEmail(String receiver, String captcha){
        boolean flag = false;
        try {
            //设置SSL连接、邮件环境
            Security.addProvider(new com.sun.net.ssl.internal.ssl.Provider());
            // 配置属性
            Properties props = new Properties();
            props.put("mail.smtp.host", "smtp.qiye.aliyun.com");//smtp服务器地址
            props.put("mail.smtp.port", "25");//非加密端口
            // 使用ssl加密方式，进行如下配置：
            props.put("mail.smtp.socketFactory.class", SSL_FACTORY);
            props.put("mail.smtp.socketFactory.fallback", "false");
            props.put("mail.smtp.socketFactory.port", port);
            props.put("mail.smtp.ssl.enable", "true");
            //props.setProperty("mail.smtp.ssl.protocols", "TLSv1.2");//若默认版本失败，可以尝试指定版本

            props.put("mail.smtp.auth", "true");//表示SMTP发送邮件，需要进行身份验证
            props.put("mail.smtp.from", user);//mailfrom 参数
            props.put("mail.user", user);//发件人的账号
            props.put("mail.password", password);// 发件人的账号的密码，如果开启三方客户端安全密码请使用新生产的密码
            //建立邮件会话
            Session session = Session.getDefaultInstance(props, new Authenticator() {
                //身份认证
                protected PasswordAuthentication getPasswordAuthentication() {
                    //发件人的账号、密码
                    return new PasswordAuthentication(user, password);
                }
            });

            //建立邮件对象
            MimeMessage message = new MimeMessage(session);
            //设置邮件的发件人
            InternetAddress from = new InternetAddress(user,"huolixiaoyuan"); //from 参数,可实现代发，注意：代发容易被收信方拒信或进入垃圾箱。
            message.setFrom(from);
            //传入收件人
            message.setRecipients(Message.RecipientType.TO, receiver);
            //设置邮件的主题
            message.setSubject("验证您的邮箱地址");
//            StringBuffer sb = new StringBuffer();
            //sb.append("<html><body>");
            String htmlContent = ("<h5>"+receiver + "，你好!</h5><br>" +
                    "<h5>我们已收到你要求获得 【活力校园】 帐户所用的一次性代码的申请。</h5><br>" +
                    "<h5>你的一次性代码为: " + captcha + "（十分钟有效）</h5><br>" +
                    "<h5>仅在官方网站或应用上输入此代码。不要与任何人共享。我们绝不会在官方平台之外索要它。</h5><br>" +
                    "<h5>谢谢，</h5><br>" +
                    "<h5>活力校园 帐户团队</h5>" +
                    "<h5><a href='https://www.huolixiaoyuan.com'>www.huolixiaoyuan.com</a></h5>");
//            sb.append("</body></html>");

            //设置邮件的文本
//            String htmlContent = "<h1>欢迎加入活力校园！您的专属验证码是：</h1>\n" +
//                    " <h2>【" + captcha + "】 </h2>\n" +
//                    "<h1>（10分钟内有效），快来开启你的活力旅程吧！<a href='https://www.huolixiaoyuan.com'>www.huolixiaoyuan.com</a>    ⚡</h1>";
//            String content="邮件内容";
            message.setContent(htmlContent,"text/html;charset=UTF-8");
            //设置时间
            message.setSentDate(new Date());
            message.saveChanges();
            //发送邮件
            Transport.send(message);
            log.info("Mail sent successfully!");
            flag = true;
        } catch (Exception e) {
            flag = false;
            e.printStackTrace();
        }
        return flag;
    }

    public static void commonSendEmail(String receiver,String subject,String content) throws Exception{
        //设置SSL连接、邮件环境
        Security.addProvider(new com.sun.net.ssl.internal.ssl.Provider());
        Properties props = System.getProperties();
        //协议
        //props.setProperty("mail.transport.protocol", "smtp");

        props.setProperty("mail.smtp.host", "smtp.qiye.aliyun.com");//smtp服务器地址
        props.setProperty("mail.smtp.port", "25");//非加密端口
        // 使用ssl加密方式，进行如下配置：
        props.setProperty("mail.smtp.socketFactory.class", SSL_FACTORY);
        props.setProperty("mail.smtp.socketFactory.fallback", "false");
        props.setProperty("mail.smtp.socketFactory.port", port);
        props.setProperty("mail.smtp.ssl.enable", "true");
        //props.setProperty("mail.smtp.ssl.protocols", "TLSv1.2");//若默认版本失败，可以尝试指定版本

        props.setProperty("mail.smtp.auth", "true");//表示SMTP发送邮件，需要进行身份验证
        props.setProperty("mail.smtp.from", user);//mailfrom 参数
        props.setProperty("mail.user", user);//发件人的账号
        props.setProperty("mail.password", password);// 发件人的账号的密码，如果开启三方客户端安全密码请使用新生产的密码
        //建立邮件会话
        Session session = Session.getDefaultInstance(props, new Authenticator() {
            //身份认证
            protected PasswordAuthentication getPasswordAuthentication() {
                //发件人的账号、密码
                return new PasswordAuthentication(user, password);
            }
        });
        //建立邮件对象
        MimeMessage message = new MimeMessage(session);
        //设置邮件的发件人
        InternetAddress from = new InternetAddress(user,"huolixiaoyuan"); //from 参数,可实现代发，注意：代发容易被收信方拒信或进入垃圾箱。
        message.setFrom(from);
        //传入收件人
        message.setRecipients(Message.RecipientType.TO, receiver);
        message.setSubject(subject);
        message.setContent(content,"text/html;charset=UTF-8");
        //设置时间
        message.setSentDate(new Date());
        message.saveChanges();
        //发送邮件
        Transport.send(message);
        log.info("发送成功！");
    }

    public static void sendEmailAttachment(String[] receiver,String subject,String content, String filePath, String filePath2) throws Exception{
        //设置SSL连接、邮件环境
        Security.addProvider(new com.sun.net.ssl.internal.ssl.Provider());
        Properties props = System.getProperties();
        //协议
        //props.setProperty("mail.transport.protocol", "smtp");

        props.setProperty("mail.smtp.host", "smtp.qiye.aliyun.com");//smtp服务器地址
        props.setProperty("mail.smtp.port", "25");//非加密端口
        // 使用ssl加密方式，进行如下配置：
        props.setProperty("mail.smtp.socketFactory.class", SSL_FACTORY);
        props.setProperty("mail.smtp.socketFactory.fallback", "false");
        props.setProperty("mail.smtp.socketFactory.port", port);
        props.setProperty("mail.smtp.ssl.enable", "true");
        //props.setProperty("mail.smtp.ssl.protocols", "TLSv1.2");//若默认版本失败，可以尝试指定版本

        props.setProperty("mail.smtp.auth", "true");//表示SMTP发送邮件，需要进行身份验证
        props.setProperty("mail.smtp.from", user);//mailfrom 参数
        props.setProperty("mail.user", user);//发件人的账号
        props.setProperty("mail.password", password);// 发件人的账号的密码，如果开启三方客户端安全密码请使用新生产的密码
        //建立邮件会话
        Session session = Session.getDefaultInstance(props, new Authenticator() {
            //身份认证
            protected PasswordAuthentication getPasswordAuthentication() {
                //发件人的账号、密码
                return new PasswordAuthentication(user, password);
            }
        });
        MimeMessage message = new MimeMessage(session);
        //邮件信息封装
        //1发件人
        InternetAddress from = new InternetAddress(user,"huolixiaoyuan"); //from 参数,可实现代发，注意：代发容易被收信方拒信或进入垃圾箱。
        message.setFrom(from);

        //2收件人
        InternetAddress[] sendTo = new InternetAddress[receiver.length];
        for (int i=0;i<receiver.length;i++){
            //System.out.println("发送到：" + to[i]);
            sendTo[i] = new InternetAddress(receiver[i]);
        }

        message.setRecipients(Message.RecipientType.TO, sendTo);
        //3邮件内容:主题、内容
        message.setSubject(subject);
        // 创建多部分消息
        MimeMultipart multipart = new MimeMultipart();

        //邮件内容部分1---文本内容
        MimeBodyPart textPart = new MimeBodyPart(); //邮件中的文字部分
        textPart.setContent(content,"text/html;charset=utf-8");
        multipart.addBodyPart(textPart);
        //邮件内容部分2---附件1
        MimeBodyPart attachmentPart = new MimeBodyPart(); //附件1
        FileDataSource fileDataSource = new FileDataSource(filePath);
        attachmentPart.setDataHandler(new DataHandler(fileDataSource));
        attachmentPart.setFileName(MimeUtility.encodeText(fileDataSource.getName(), "UTF-8", "B"));

        multipart.addBodyPart(attachmentPart);

        MimeBodyPart attachmentPart2 = new MimeBodyPart(); //附件2
        FileDataSource fileDataSource2 = new FileDataSource(filePath2);
        attachmentPart2.setDataHandler(new DataHandler(fileDataSource2));
        attachmentPart2.setFileName(MimeUtility.encodeText(fileDataSource2.getName(), "UTF-8", "B"));
        multipart.addBodyPart(attachmentPart2);
        // 设置邮件内容
        message.setContent(multipart);
        // 发送邮件
        Transport.send(message);
        log.info("邮件发送成功！");
    }
//
//    public static void main(String[] args) {
//        try {
//            commonSendEmail("36345846@qq.com", "test", "HELLO WORLD!!!");
//        } catch (Exception e) {
//            e.printStackTrace();
//        }
//    }
/*
    public static void main(String[] args) {
        try{
            //设置SSL连接、邮件环境
            Security.addProvider(new com.sun.net.ssl.internal.ssl.Provider());
            final String SSL_FACTORY = "javax.net.ssl.SSLSocketFactory";
            Properties props = System.getProperties();
            //协议
            //props.setProperty("mail.transport.protocol", "smtp");

            props.setProperty("mail.smtp.host", "smtp.qiye.aliyun.com");//smtp服务器地址
            props.setProperty("mail.smtp.port", "25");//非加密端口
            // 使用ssl加密方式，进行如下配置：
            props.setProperty("mail.smtp.socketFactory.class", SSL_FACTORY);
            props.setProperty("mail.smtp.socketFactory.fallback", "false");
            props.setProperty("mail.smtp.socketFactory.port", "465");
            props.setProperty("mail.smtp.ssl.enable", "true");
            //props.setProperty("mail.smtp.ssl.protocols", "TLSv1.2");//若默认版本失败，可以尝试指定版本

            props.setProperty("mail.smtp.auth", "true");//表示SMTP发送邮件，需要进行身份验证
            props.setProperty("mail.smtp.from", "service@huolixiaoyuan.com");//mailfrom 参数
            props.setProperty("mail.user","service@huolixiaoyuan.com");//发件人的账号
            props.setProperty("mail.password","^YHNmju7");// 发件人的账号的密码，如果开启三方客户端安全密码请使用新生产的密码
            //建立邮件会话
            Session session = Session.getDefaultInstance(props, new Authenticator() {
                //身份认证
                protected PasswordAuthentication getPasswordAuthentication() {
                    //发件人的账号、密码
                    String userName = "service@huolixiaoyuan.com"; //props.getProperty("mail.user");
                    String password = "^YHNmju7"; //props.getProperty("mail.password");
                    return new PasswordAuthentication(userName, password);
                }
            });
            //建立邮件对象
            MimeMessage message = new MimeMessage(session);
            //设置邮件的发件人
            InternetAddress from = new InternetAddress("service@huolixiaoyuan.com","huolixiaoyuan"); //from 参数,可实现代发，注意：代发容易被收信方拒信或进入垃圾箱。
            message.setFrom(from);
            //设置邮件的收件人
            String[] to = {"36345846@qq.com"};//收件人列表
            InternetAddress[] sendTo = new InternetAddress[to.length];
            for (int i=0;i<to.length;i++){
                //System.out.println("发送到：" + to[i]);
                sendTo[i] = new InternetAddress(to[i]);
            }

            //传入收件人
            message.setRecipients(Message.RecipientType.TO,sendTo);
            //设置邮件的主题
//            message.setSubject("邮件主题");

            message.setSubject("【中期提醒】2025活力校园优秀案例征集即将进入倒计时！7月6日截止申报");

            //设置邮件的文本

            String htmlContent = ("尊敬的老师：<br>" +
                    "<p>您好！2025年（第八届）活力校园优秀案例征集活动已收到全国教育工作者的热烈响应。" +
                    "现温馨提醒您：<b>案例提交截止日期为2025年7月6日，距今仅剩1个月时间！</b>我们诚挚邀请您申报本届案例，" +
                    "分享您在课堂教学、体育活动、校园文化建设、资源创新、家校社联动等方面的优秀实践，" +
                    "也欢迎您将信息<b>转发推荐给身边同样投身体育教育的同行们。</b></p>" +
                    "<p><b>征集对象：</b>本届案例申报共分四类，分别为优秀体育教师案例、优秀校长案例、优秀体育教研员案例、活力校园推广大使。" +
                    "欢迎符合条件的教育工作者踊跃参与！</p>" +
                    "<p><b>入选者将有机会：</b>获得海外交流培训机会（优秀案例负责人）、" +
                    "获得连续三年项目支持与资源激励（推广大使）、入选案例将通过媒体宣传、教案展示等方式予以推广。</p>" +
                    "<p><b>申报截止时间：2025年7月6日</b></p>" +
                    "<p><b>申报入口及详细信息请登录：</b> <a href='https://www.huolixiaoyuan.com'>www.huolixiaoyuan.com</a></p>" +
                    "<hr><br>" +
                    "如有任何技术或流程问题，欢迎随时联系我们：<br>" +
                    "联系电话：15800591257、19521251278（服务时间：工作日 9:00-19:00）<br>" +
                    "联系邮箱：help@huolixiaoyuan.com<br>" +
                    "官方客服微信：Nikehuolixiaoyuan<br>"+
                    "<img src = 'https://nike-huolixiaoyuan.oss-rg-china-mainland.aliyuncs.com/upload/prod/20250606/活力校园官方客服微信_1749199925478.png'><br>"+
                    "感谢您对“活力校园”项目的持续关注与支持！<br>" +
                    "期待看到您的精彩案例！<br>" +
                    "祝工作顺利、身心健康！<br><br>" +
                    "<p><b>活力校园优秀案例征集活动办公室</b></p>" +
                    "2025年6月");
//            String content="邮件内容";
            message.setContent(htmlContent,"text/html;charset=UTF-8");
            //设置时间
            message.setSentDate(new Date());
            message.saveChanges();
            //发送邮件
            Transport.send(message);
            System.out.println("发送成功！");
        }catch(Exception e){
            System.out.println("异常："+e.getMessage());
        }
    }*/
}
